part of 'kit.dart';

/// 这个参数保存了连接Postgresql进程所需要的host、账号密码等信息
final argPostgres = Argument<ArgPostgres>();

/// Postgres所需要的参数，由于3个总是一起出现，因此将它们打捆起来
class ArgPostgres {
  /// 连接的host，比如localhost
  final String host;

  /// 整个Postgresql有用户名和密码需要设置
  final String userName;
  final String password;

  ArgPostgres({
    required this.host,
    required this.userName,
    required this.password,
  });

  /// 用于测试的本地数据库，需要保证本机上有Postgresql程序运行，并且自行设置账号密码
  factory ArgPostgres.local() => ArgPostgres(
        host: "localhost",
        userName: "lucidquantum",
        // 由于dartkit是公开的，为了防止密码泄露临时编了一个随机的密码
        password: "g3g43h424g",
      );
}

/// 在单个应用中，暂时约定只使用单一的数据库（但是在很多测试中会建立不同的数据以防数据冲突）
/// 初始化数据库的名称后，就会将数据库赋值给这个变量
final argConn = Argument<Connection>();

/// 使用特定的信息初始化数据库，并建立某个名字的连接
/// 只要调用这个函数，就可以自动创建某个名字的数据库并赋予两个变量
/// 而不需要单独去记忆变量，非常方便
Future<void> initConnection(
  ArgPostgres arg,
  String databaseName,
) async {
  // 赋值登录信息
  argPostgres.value = arg;
  // 首先创建数据库，然后连接
  await DatabaseKit.create(databaseName);
  final conn = await DatabaseKit.open(databaseName);
  // 将连接好的值赋予全局连接
  assert(conn.isOpen);
  argConn.value = conn;
}
